//
//  SqQueueExt.cpp
//  DataStructure
//
//  Created by 舒磊明 on 2020/7/2.
//  Copyright © 2020 Shuleiming. All rights reserved.
//

#include "SqQueueExt.hpp"

// tag队列入队
bool TagPush(TagQueue &Q, ElemType x)
{
    if (Q.tag == 1 && Q.front == Q.rare) {  // 判断队满
        return false;
    }
    Q.data[Q.rare] = x; // 入队
    Q.rare = (Q.rare + 1) % MAX_SIZE; // 指针向后移动
    Q.tag = 1; // 修改tag
    return true;
}

// tag队列出队
bool TagPop(TagQueue &Q, ElemType &x)
{
    if (Q.tag == 0 && Q.front == Q.rare) { // 判断队空
        return false;
    }
    x = Q.data[Q.front]; // 出队
    Q.front = (Q.front + 1) % MAX_SIZE; // 指针向后移动
    Q.tag = 0;  // 修改tag
    return true;
}

// Q是队列，S是栈，将队列逆序
void QueueReverse(SqQueue &Q, SqStack &S)
{
    // 出队，入栈；出栈，入队
    int x;
    while (DeQueue(Q, x)) {
        Push(S, x);
    }
//    while (Pop(S, x)) { // 未知原因报错了。。。
//        EnQueue(Q, x);
//    }
}

// 栈的操作：Push,Pop,StackEmpty,StackOverflow
// 实现队列操作：EnQuqeue,DeQueue,QueueEmpty
/*
 bool EnQueue(Stack &S1, Stack &S2, ElemType x)
 {
    if (!StackOverflow(S1)) { // 入队
        Push(S1, x);
        return true;
    }
    if (StackOverflow(S1) && !StackEmpty(S2)) { // 队列满
        return false;
    }
    int k;
    while (Pop(S1, k)) { // 把S1的数据导入S2中
        Push(S2, k);
    }
    Push(S1, x);
    return true;
 }
 bool DeQueue(Stack &S1, Stack &S2, ElemType &x)
 {
    if (!StackEmpty(S2)) { // 出队
        Pop(S2, x);
        return true;
    }
    if (StackEmpty(S1) && StackEmpty(S2)) {
        return false;
    }
    int k;
    while (Pop(S1, k)) {
        Push(S2, k);
    }
    Pop(S2, x);
    return true;
 }
 bool QueueEmpty(Stack S1, Stack S2)
 {
    return StackEmpty(S1) && StackEmpty(S2);
 }
 */
